/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package savet.gui.modelos;

import java.util.Date;
import java.util.List;
import java.util.Observable;
import savet.entidades.Trabalhador;
import savet.entidades.atributos.AtributoData;
import savet.entidades.atributos.Rescisao;
import savet.util.Trabalhadores;

/**
 *
 * @author Adisson Marinho
 */
public class ModeloRescisao extends AbstractAtributoDataModel {

    public ModeloRescisao(Object[] colunas) {
        super(colunas);
    }

    public ModeloRescisao(Object[] colunas, Date inicio, Date fim) {
        super(colunas, inicio, fim);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Trabalhador trabalhador = getTrabalhador(rowIndex);
        for (int i = 0; i < trabalhadores.size(); i++) {
            int countAp = 0;
            int countPD = 0;
            int countTR = 0;

            for (int j = 0; j < getColumnCount(); j++) {
                if (getColumnName(j).equals("Avi. Pre.")) {
                    if (j == columnIndex) {
                        return trabalhador.getRescisao().getAvisoPrevio().get(countAp);
                    }
                    countAp++;
                } else if (getColumnName(j).equals("Ped. Dem.")) {
                    if (j == columnIndex) {
                        return trabalhador.getRescisao().getPedidoDemissao().get(countPD);
                    }
                    countPD++;
                } else if (getColumnName(j).equals("Ter. Resc.")) {
                    if (j == columnIndex) {
                        return trabalhador.getRescisao().getTermo().get(countTR);
                    }
                    countTR++;
                }
            }
        }
        return null;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Trabalhador trabalhador = getTrabalhador(rowIndex);
        AtributoData att = (AtributoData) aValue;

        for (int i = 0; i < trabalhadores.size(); i++) {
            int countAp = 0;
            int countPD = 0;
            int countTR = 0;

            for (int j = 0; j < getColumnCount(); j++) {
                if (getColumnName(j).equals("Avi. Pre.")) {

                    if (j == columnIndex) {
                        trabalhador.getRescisao().getAvisoPrevio().set(countAp, att);
                    }
                    countAp++;
                } else if (getColumnName(j).equals("Ped. Dem.")) {
                    if (j == columnIndex) {
                        trabalhador.getRescisao().getPedidoDemissao().set(countPD, att);
                    }
                    countPD++;
                } else if (getColumnName(j).equals("Ter. Resc.")) {
                    if (j == columnIndex) {
                        trabalhador.getRescisao().getTermo().set(countTR, att);
                    }
                    countTR++;
                }
            }
        }
    }

    public void elementoAdicionado(Trabalhador trabalhador) {
        criarAtributoRescisao(trabalhador);
        fireTableDataChanged();
    }

    public void elementoRemovido(Trabalhador trabalhador) {
        fireTableDataChanged();
    }

    @Override
    protected void carregarAtributos() {
        for (Trabalhador trabalhador : trabalhadores) {
            criarAtributoRescisao(trabalhador);
        }
    }

    private void criarAtributoRescisao(Trabalhador trabalhador) {
        if (trabalhador.getRescisao() == null) {
            Rescisao rescisao = new Rescisao();
            rescisao.setTrabalhador(trabalhador);
            rescisao.setAvisoPrevio(Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo));
            rescisao.setPedidoDemissao(Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo));
            rescisao.setTermo(Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo));
            trabalhador.setRescisao(rescisao);
        } else {
            atualizarAtributoRescisao(trabalhador);
        }
    }

    private void atualizarAtributoRescisao(Trabalhador trabalhador) {
        Rescisao rescisao = trabalhador.getRescisao();

        if (rescisao != null) {
            List<AtributoData> oldAvisos = rescisao.getAvisoPrevio();
            List<AtributoData> oldPedidos = rescisao.getPedidoDemissao();
            List<AtributoData> oldTermos = rescisao.getTermo();

            List<AtributoData> newAvisos = Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo);
            List<AtributoData> newPedidos = Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo);
            List<AtributoData> newTermos = Trabalhadores.getListaAtributoAnos(inicioPeriodo, fimPeriodo);

            super.atualizaListaAtributos(newAvisos, oldAvisos);
            super.atualizaListaAtributos(newPedidos, oldPedidos);
            super.atualizaListaAtributos(newTermos, oldTermos);

            rescisao.setAvisoPrevio(newAvisos);
            rescisao.setPedidoDemissao(newPedidos);
            rescisao.setTermo(newTermos);
        } else {
            criarAtributoRescisao(trabalhador);
        }
    }

    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof Trabalhador) {
            Trabalhador t = (Trabalhador) arg;
            atualizarAtributoRescisao(t);
        }
    }
}
